package collection;

import bean.CompareByLen;
import bean.Person;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * Set相对于List、Map是最简单的一种集合。集合中的对象不按特定的方式排序，并且没有重复对象。
 */
public class SetDemo {
    /**
     * HashSet： HashSet类按照哈希算法来存取集合中的对象，存取速度比较快(无序)
     * LinkedHashSet HashSet子类与HashSet的原理一样,但是使用链表维护元素的顺序(有序的,不允许重复),查询要好于HashSet,但插入稍微逊色于HashSet;
     * TreeSet：TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序,也可以可以指定顺序,对象存入之后按照指定的顺序排列
     *          Set是不可重复的，TreeSet是有序的，HashSet是无序的。
     * Set集合也可以存储null，但只能存储一个，即使添加多个也只能存储一个；
     */
    public static void main(String[] args) {
        /*
         * boolean add(Object o)   :向集合中加入一个对象的引用
         * void clear()            :删除集合中所有的对象，即不再持有这些对象的引用
         * boolean isEmpty()       :判断集合是否为空
         * boolean contains(Object o): 判断集合中是否持有特定对象的引用
         * Iterartor iterator()     : 返回一个Iterator对象，可以用来遍历集合中的元素
         * boolean remove(Object o):从集合中删除一个对象的引用
         * int size()               :返回集合中元素的数目
         * Object[] toArray()       :返回一个数组，该数组中包括集合中的所有元素
         */
        Set<Integer> hashSet = new HashSet<Integer>();
        hashSet.add(3);
        hashSet.add(2);
        hashSet.add(5);
        hashSet.add(1);
        //模拟添加一个重复数据
        hashSet.add(2);    //当向set集合中存储重复元素的时候返回为false
        System.out.println( "set hashSet :" + hashSet + " size : " + hashSet.size());
        //Set遍历  for循环方式
        for (Integer integer : hashSet) {
            System.out.println("set integer :" + integer);
        }

        //迭代器方式
        Iterator<Integer> iterator = hashSet.iterator();  //获取迭代器
        while (iterator.hasNext()) {                     //集合中的迭代方法(判断集合中是否有元素)
            Integer integer = iterator.next();          //获取集合元素
            System.out.println("set integer :" + integer);
        }

        Set<Integer> treeSet = new TreeSet<>();
        treeSet.add(3);
        treeSet.add(2);
        treeSet.add(5);
        treeSet.add(1);
        System.out.println("set treeSet :" + treeSet + " size : " + treeSet.size());

        Set<Person> treeSet1 = new TreeSet<>();  //采用Comparable比较器,第一种比较方式
        treeSet1.add(new Person("李四", 13));   //年龄排序
        treeSet1.add(new Person("张三", 23));
        treeSet1.add(new Person("周七", 13));
        treeSet1.add(new Person("王五", 43));
        treeSet1.add(new Person("赵六", 33));

//        treeSet1.add(new Person("李四", 13));   //姓名排序
//        treeSet1.add(new Person("张三", 23));
//        treeSet1.add(new Person("王五", 43));
//        treeSet1.add(new Person("赵六", 33));
//        System.out.println('张' + 0);  ascll值
//        System.out.println('李' + 0);
//        System.out.println('王' + 0);
//        System.out.println('赵' + 0);

        System.out.println(treeSet1);


        TreeSet<String> ts = new TreeSet(new CompareByLen());		//采用Comparator比较器,第二种比较方式
        ts.add("aaaaaaaa");
        ts.add("z");
        ts.add("wc");
        ts.add("nba");
        ts.add("cba");

        System.out.println(ts);

    }
}
